package structures.recursion;

public class QueenEight {
    private static final int max = 8;
    private static int[] array = new int[max];
    public static void main(String[] args) {
        placeQueen(0);
    }

    /**
     * 放置第N行的皇后
     * @param row
     */
    private static void placeQueen(int row) {
        if (row == max) {
            printIntArray(array);
            return;
        }

        // 一次放入皇后  并判断是否冲突
        for (int data = 0; data < max; data++) {
            // 不冲突  则继续往下行遍历
            if (judge(row, data)) {
                array[row] = data;
                placeQueen(row+1);
            }
            // 冲突 则继续放置本行的下一个位置
        }

    }

    /**
     * 判断 data是不是与int[]中的已摆皇后位置发生冲突 同一列或者同一斜线
     * @param row
     * @param data
     * @return
     */
    private static boolean judge(int row, int data) {
        for (int index = 0; index < row; index++) {
            if (array[index] == data ||
                Math.abs(row - index) == Math.abs(data - array[index])) {
                return false;
            }
        }
        return true;
    }

    /**
     * 打印 int[]
     * @param array
     */
    private static void printIntArray(int[] array) {
        for (int data : array) {
            System.out.print(data + "\t");
        }
        System.out.println();
    }
}
